package com.lwl.blog.web.controller;

import com.lwl.blog.core.dto.EmailDto;
import com.lwl.blog.core.utils.EmailUtils;
import com.lwl.blog.core.utils.R;
import com.lwl.blog.core.exception.JsonException;

import com.lwl.blog.web.entity.UserEntity;
import com.lwl.blog.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;

/**
 * 帖子用户响应层
 */
@Controller
@RequestMapping("/userController")
public class UserController{

    //调用userservice层
    @Autowired
    private UserService userService;


    //用户登录的方法
    @PostMapping("/login")
    @ResponseBody
    public R login(@RequestBody UserEntity u, HttpSession session) throws IOException, SQLException {

        //3.调用service层，让service处理login账号密码的比对
        u = userService.login(u.getUsername(), u.getPassword());
        System.out.println(u);
        //4.判断数据是否为空，登录成功
        if (u != null) {
            //5.密码作为敏感地段，需要将其设置为null
            u.setPassword(null);
            //6.将其放到会话对象中
            session.setAttribute("loginUser", u);
            System.out.println("session"+session.getAttribute("loginUser"));
            return R.ok();
        }else {
            return R.error("用户账号或密码错误！");
        }

    }


    @PostMapping("/register")
    @ResponseBody
    public R register(@RequestBody UserEntity u) throws Exception {
        //1.接收前端传过来的数据
        u.setPassword(u.getPassword());
        System.out.println(u);

        //3.调用业务层注册方法
        String register = userService.register(u);
        if (!"注册成功".equals(register)){
            return R.error(register);
        }
        String activationCode = u.getActivationCode();

        EmailDto e=new EmailDto();
        e.setTilte("论坛用户注册成功！");
        e.setToUser(u.getEmail());//设置邮箱
//        e.setContent("点击激活");
        e.setContent("<a href = 'http://127.0.0.1:8002/userController/activation?code=" + activationCode + "'>点击激活</a>");

        //启动一个线程去发送邮件
        new Thread(()->{
            try {
                // 邮件发送完成后需要记录邮件发送的状态(成功或失败)
                // 如果是失败了要把这个邮件持久化了(保存到数据库)，然后启动一个定时任务去轮训的发邮件
                EmailUtils.sendEmailInfoUser(e);
            }catch (Exception e1){
                e1.printStackTrace();
            }

        }).start();

        //4.outjson做提示
        return R.ok();
    }


    // 激活哪个账号？
    // 在一个接口中可能返回json，也有可能是视图
    @GetMapping("/activation")
    public String activation(@RequestParam("code") String code) throws Exception {
        //1.获得激活码
        System.out.println("code:"+code);
        //2.比对激活码
        UserEntity u=userService.selectActCode(code);
        System.out.println("UserController.activation："+u);

        //判断是否为空
        if (u!=null){
            //修改状态码
            u.setStatus(1);
            userService.updateById(u);
            // 返回登陆页面
            return "redirect:/view/site/login.html";
        }else {
            System.out.println("激活码有误");
            // 抛出一个异常交给全局异常管理器，异常处理后以JSON格式响应
//            throw new JsonException(101, "激活码有误");
            throw  new JsonException(101,"激活码有误!");
        }
    }


    //注销
    @GetMapping("/logout")
    public String logout(HttpSession session) throws Exception {
        session.invalidate();
        return  "redirect:/view/site/login.html";
    }


    @GetMapping("/info/{id}")
    public String info(@PathVariable Integer id, ModelMap map){
        //调用service层查询用户的id信息
        UserEntity userEntity=userService.getById(id);
        System.out.println("info:userEntity:");
        System.out.println(userEntity);
        userEntity.setPassword(null);
        map.put("user", userEntity);
        map.put("hasFollowed", false); // 没有关注
        map.put("followerCount", 0); // 它关注了多少人
        map.put("fansCount", 0); // 它有多少粉丝
        map.put("userLikeCount", 0); // 它有的多少个赞(帖子，评论)
        return "view/site/profile";
    }

}
